package mpbe.estructura;

/*
 * Este codigo es software libre y se encuentra licenciado 
 * bajo los términos de la Licencia Pública General de GNU versión 3 
 * según se encuentra publicada por la Free Software Foundation.
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Autor: Martin Pablo Bellanca <martin.bellanca@gmail.com>
 * web: http://mpbe.blogspot.com/
 */

import java.util.Vector;
import java.lang.Math;

public class UnidadesLista {
	public Vector<Unidad> Fuerzas;
	public Vector<Unidad> Longitudes;
	public Vector<Unidad> Angulares;
	
	public UnidadesLista() {
		Fuerzas = new Vector<Unidad>();
		Longitudes = new Vector<Unidad>();
		Angulares = new Vector<Unidad>();
	}
	
	public UnidadesLista(String archivo) {
		Fuerzas = new Vector<Unidad>();
		Longitudes = new Vector<Unidad>();
		Angulares = new Vector<Unidad>();
		cargarUnidades(archivo);
	}
	
	public boolean cargarUnidades(String archivo) {
		// TODO Cargar unidades desde archivo
		Unidad un = new Unidad();
		// Angulares - Base Gradianes
		un.Designacion = "radianes"; //radianes
		un.Coef = 1;
		Angulares.add(un);
		un = new Unidad(); // grados
		un.Designacion = "grados";
		un.Coef = 180/Math.PI;
		Angulares.add(un);
		
		// Longitudes - Base cm
		un = new Unidad(); // mm
		un.Designacion = "mm";
		un.Coef = 10;
		Longitudes.add(un);
		un = new Unidad(); // cm
		un.Designacion = "cm";
		un.Coef = 1;
		Longitudes.add(un);
		un = new Unidad(); // grados
		un.Designacion = "dm";
		un.Coef = 0.1;
		Longitudes.add(un);
		un = new Unidad(); // m
		un.Designacion = "m";
		un.Coef = 0.01;
		Longitudes.add(un);
		
		// Fuerzas - Base KN
		un = new Unidad(); // Newton 1000N=1KN
		un.Designacion = "N";
		un.Coef = 1000;
		Fuerzas.add(un);
		un = new Unidad(); // KN
		un.Designacion = "KN";
		un.Coef = 1;
		Fuerzas.add(un);
		un = new Unidad(); // MN 1MN=1000KN
		un.Designacion = "MN";
		un.Coef = 0.001;
		Fuerzas.add(un);
		un = new Unidad(); // Kg 1Kg=9.81N=0.00981KN
		un.Designacion = "Kg";
		un.Coef = 100;
		Fuerzas.add(un);
		un = new Unidad(); // Tn 1Tn=9.81KN
		un.Designacion = "Tn";
		un.Coef = 0.1;
		Fuerzas.add(un);
		
		return true;
	}

	// funciones de conversion
	static public double convertir(double valor, Unidad uEntrada, Unidad uSalida) {
		return valor*uSalida.Coef/uEntrada.Coef;
	}
	static public double convertir(double valor, Unidad uEntrada, Unidad uSalida, double potencia) {
		return valor*Math.pow(uSalida.Coef/uEntrada.Coef, potencia);
	}
	public double convertir(double valor, String uEntrada, String uSalida) {
		Unidad ue = get(uEntrada);
		Unidad us = get(uSalida);
		return valor*us.Coef/ue.Coef;
	}

	
	// gets unidades
	public Unidad get(String designacion) {
		Unidad res = getAngular(designacion);
		if (res == null) return res;
		res = getLongitud(designacion);
		if (res == null) return res;
		return res = getFuerza(designacion);
	}
	
	public Unidad getAngular(String designacion){
		Unidad res = new Unidad();
		Unidad aux = new Unidad();
		for (int ii = 0; ii < Angulares.size(); ii++){
			aux = Angulares.get(ii);
			if (aux.Designacion.equals(designacion)) {
				res = aux;
				break;
			}
		}
		return res;
	}
	
	public Unidad getLongitud(String designacion){
		Unidad res = new Unidad();
		Unidad aux = new Unidad();
		for (int ii = 0; ii < Longitudes.size(); ii++){
			aux = Longitudes.get(ii);
			if (aux.Designacion.equals(designacion)) {
				res = aux;
				break;
			}
		}
		return res;
	}
	
	public Unidad getFuerza(String designacion){
		Unidad res = new Unidad();
		Unidad aux = new Unidad();
		for (int ii = 0; ii < Fuerzas.size(); ii++){
			aux = Fuerzas.get(ii);
			if (aux.Designacion.equals(designacion)) {
				res = aux;
				break;
			}
		}
		return res;
	}

	// Indexof()
	public int indexOfAngular(String designacion){
		int res = -1;
		for (int ii = 0; ii < Angulares.size(); ii++){
			if (Angulares.get(ii).Designacion.equals(designacion)) {
				res = ii;
				break;
			}
		}	
		return res;
	}

	public int indexOfLongitud(String designacion){
		int res = -1;
		for (int ii = 0; ii < Longitudes.size(); ii++){
			if (Longitudes.get(ii).Designacion.equals(designacion)) {
				res = ii;
				break;
			}
		}	
		return res;
	}

	public int indexOfFuerza(String designacion){
		int res = -1;
		for (int ii = 0; ii < Fuerzas.size(); ii++){
			if (Fuerzas.get(ii).Designacion.equals(designacion)) {
				res = ii;
				break;
			}
		}	
		return res;
	}

}
